海尔单片机 I/O直接驱动LCD显示的方法和代码实例
本帖最后由 咔咔特 于 2013-3-22 16:28 编辑低成本的应用方案中,一般较少的段位数的LCD显示,都直接使用通用的I/O直接驱动段位的LCD。
比如直发器的应用中,3位数码及其他图标显示的LCD,一般是4COMx8SEG内的连线。本贴给出原理图和LCD驱动实例。供参考。
本帖最后由 咔咔特 于 2013-3-22 16:25 编辑
原理图
(不知如何贴图,把文件上传进来了) 本帖最后由 咔咔特 于 2013-3-22 16:28 编辑
汇编代码
;;;***********************************************************
;;;====== 深圳市??电子有限公司 ======
;;; 4COMx8SEG LCD动态显示刷新
;;;
;;;作 者: yejian
;;;版 本: V0.1 初次版本
;;;***********************************************************
;LCD驱动脚
#DEFINE IO_SEG_0 PA,0
#DEFINE IO_SEG_1 PA,1
#DEFINE IO_SEG_2 PA,2
#DEFINE IO_SEG_3 PA,3
#DEFINE IO_SEG_4 PB,4
#DEFINE IO_SEG_5 PC,5
#DEFINE IO_SEG_6 PA,6
#DEFINE IO_SEG_6 PA,7
#DEFINE IO_COM0 PB,0
#DEFINE IO_COM1 PB,1
#DEFINE IO_COM2 PB,2
#DEFINE IO_COM3 PB,3
SECTION3_RAM_SEG UNINTIAL
;***BANK 3****
D_DATA RSEG 0x04 ;显示数据RAM,更改显示内容时更新数据
D_Index RSEG 0x01
;==========================================================
_LCD_DRIVER CSEG
;====
;COM和SEG波形
; 1)有效 COM脚输出VDD,SEG输出VSS
; 无效的COM输出VDD/2(I/O作为输入,外接电阻使其电压在VDD/2),SEG输出VDD
; 2)下一周期,COM和SEG的输出都反相,保持显示的段位电压交流有效值是VDD,而直流有效值是0。
; 3)换一个COM,继续
;=====================================================
;***动态显示刷新******
;每间隔大约2MS,调用一次本子程序
;** 显示 *****
_LCD_DISPLAY
BANK 3
JBS D_Index,7
JUMP NEW_COM
BCC D_Index,7
;*** COM&SEG反向 *****
MOVI 0xFF
XOR PB,REG ;//
MOVI 0x0F
XOR PA,REG
JUMP DISPLAY_RET
;====新的COM输出,段数据,更换=====
NEW_COM
;==更新COM索引===
BCC PSW,C
RL D_Index,A
ANDI 0x0F
JBC PSW,Z
MOVI 0x01
MOVA D_Index
MOVI 0x0F
TRIS PB
;===SEG和COM都输出高===
MOVI 0x0F
IOR PA,REG
MOVI 0xFF
IOR PB,REG
JBC D_Index,0
JUMP _COM0_ACTIVE
JBC D_Index,1
JUMP _COM1_ACTIVE
JBC D_Index,2
JUMP _COM2_ACTIVE
JBC D_Index,3
JUMP _COM3_ACTIVE
JUMP DISPLAY_RET
;===IO_COM0~IO_COM3,输出1/2VDD,有效COM输出VDD===
_COM0_ACTIVE:
MOVI 0x0E ;COOM0输出VDD
TRIS PA
MOVI D_DATA
JUMP _NEW_SEG
_COM1_ACTIVE:
MOVI 0x0D ;COOM1输出VDD
TRIS PA
MOVI D_DATA+1
JUMP _NEW_SEG
_COM2_ACTIVE:
MOVI 0x0B ;COOM2输出VDD
TRIS PA
MOVI D_DATA+2
JUMP _NEW_SEG
_COM3_ACTIVE:
MOVI 0x07 ;COOM3输出VDD
TRIS PB
MOVI D_DATA+3
;===段数据索引===
_NEW_SEG:
MOVA IAA
JBC IAD,0
BCC IO_SEG_0
JBC IAD,1
BCC IO_SEG_1
JBC IAD,2
BCC IO_SEG_2
JBC IAD,3
BCC IO_SEG_3
JBC IAD,4
BCC IO_SEG_4
JBC IAD,5
BCC IO_SEG_5
JBC IAD,6
BCC IO_SEG_6
BSS D_Index,7 ;设置标志:COM输出正VDD
DISPLAY_RET
BANK 0
RETIA 0
;======================================================================= 咔咔特 发表于 2013-3-22 16:24 static/image/common/back.gif
原理图
不错的帖子! 点击发帖子的界面图片选择上传图片。
本帖最后由 咔咔特 于 2013-3-22 17:16 编辑
补贴上原理图,需要得更清楚,请下载PDF文件。 我也来贴一个用HR6P61的IO模拟的断码屏显示温度的代码。
/*
项目:沐浴器温度指示灯
芯片:HR6P61P2S2L 内部晶振8M
功能:
一个AD脚检测温度
输出三色灯和数码显示
32度以下背光绿色,33-39度蓝色;40度以上红色,液晶按实际温度显示
*/
#include <hic.h>
//输入
//输出
#define LED_RED PA3
#define LED_GREEN PA4
#define LED_BLUE PA2
#define LCD_P1 PB7
#define LCD_P2 PB6
#define LCD_P3 PB5
#define LCD_SEG1 PB4
#define LCD_SEG2 PB3
#define LCD_SEG3 PB2
#define LCD_SEG4 PB1
#define LCD_SEG5 PA6
#define LCD_SEG6 PA7
#define LCD_SEG7 PA0
//低位在前
const uint8 lcd_table1 = {
//0 1 2 3 4 5 6 7 8 9
0x8F, 0xBF, 0x9F, 0x9F, 0xAF, 0xCF, 0xCF, 0x9F, 0x8F, 0x8F,
0x87, 0xB7, 0x97, 0x97, 0xA7, 0xC7, 0xC7, 0x97, 0x87, 0x87,
0x83, 0xB3, 0x93, 0x93, 0xA3, 0xC3, 0xC3, 0x93, 0x83, 0x83,
0x83, 0xB3, 0x93, 0x93, 0xA3, 0xC3, 0xC3, 0x93, 0x83, 0x83,
0x85, 0xB5, 0x95, 0x95, 0xA5, 0xC5, 0xC5, 0x95, 0x85, 0x85,
0x89, 0xB9, 0x99, 0x99, 0xA9, 0xC9, 0xC9, 0x99, 0x89, 0x89,
0x89, 0xB9, 0x99, 0x99, 0xA9, 0xC9, 0xC9, 0x99, 0x89, 0x89,
0x83, 0xB3, 0x93, 0x93, 0xA3, 0xC3, 0xC3, 0x93, 0x83, 0x83,
0x81, 0xB1, 0x91, 0x91, 0xA1, 0xC1, 0xC1, 0x91, 0x81, 0x81,
0x81, 0xB1, 0x91, 0x91, 0xA1, 0xC1, 0xC1, 0x91, 0x81, 0x81,
0x81, 0xB1, 0x91, 0x91, 0xA1, 0xC1, 0xC1, 0x91, 0x81, 0x81,
0x87, 0xB7, 0x97, 0x97, 0xA7, 0xC7, 0xC7, 0x97, 0x87, 0x87,
0x83, 0xB3, 0x93, 0x93, 0xA3, 0xC3, 0xC3, 0x93, 0x83, 0x83,
0x83, 0xB3, 0x93, 0x93, 0xA3, 0xC3,/* 0xC3, 0x93, 0x83, 0x83,
0x85, 0xB5, 0x95, 0x95, 0xA5, 0xC5, 0xC5, 0x95, 0x85, 0x85,
0x89, 0xB9, 0x99, 0x99, 0xA9, 0xC9, 0xC9, 0x99, 0x89, 0x89,
0x89, 0xB9, 0x99, 0x99, 0xA9, 0xC9, 0xC9, 0x99, 0x89, 0x89,
0x83, 0xB3, 0x93, 0x93, 0xA3, 0xC3, 0xC3, 0x93, 0x83, 0x83,
0x81, 0xB1, 0x91, 0x91, 0xA1, 0xC1, 0xC1, 0x91, 0x81, 0x81,
0x81, 0xB1, 0x91, 0x91, 0xA1, 0xC1, 0xC1, 0x91, 0x81, 0x81,*/
};
const uint8 lcd_table2 = {
//0 1 2 3 4 5 6 7 8 9
0x2F, 0x3F, 0x4F, 0x1F, 0x1F, 0x1F, 0x0F, 0x3F, 0x0F, 0x1F,
0x27, 0x37, 0x47, 0x17, 0x17, 0x17, 0x07, 0x37, 0x07, 0x17,
0x29, 0x39, 0x49, 0x19, 0x19, 0x19, 0x09, 0x39, 0x09, 0x19,
0x23, 0x33, 0x43, 0x13, 0x13, 0x13, 0x03, 0x33, 0x03, 0x13,
0x23, 0x33, 0x43, 0x13, 0x13, 0x13, 0x03, 0x33, 0x03, 0x13,
0x23, 0x33, 0x43, 0x13, 0x13, 0x13, 0x03, 0x33, 0x03, 0x13,
0x21, 0x31, 0x41, 0x11, 0x11, 0x11, 0x01, 0x31, 0x01, 0x11,
0x27, 0x37, 0x47, 0x17, 0x17, 0x17, 0x07, 0x37, 0x07, 0x17,
0x21, 0x31, 0x41, 0x11, 0x11, 0x11, 0x01, 0x31, 0x01, 0x11,
0x23, 0x33, 0x43, 0x13, 0x13, 0x13, 0x03, 0x33, 0x03, 0x13,
0x25, 0x35, 0x45, 0x15, 0x15, 0x15, 0x05, 0x35, 0x05, 0x15,
0x27, 0x37, 0x47, 0x17, 0x17, 0x17, 0x07, 0x37, 0x07, 0x17,
0x29, 0x39, 0x49, 0x19, 0x19, 0x19, 0x09, 0x39, 0x09, 0x19,
0x23, 0x33, 0x43, 0x13, 0x13, 0x13,/* 0x03, 0x33, 0x03, 0x13,
0x23, 0x33, 0x43, 0x13, 0x13, 0x13, 0x03, 0x33, 0x03, 0x13,
0x23, 0x33, 0x43, 0x13, 0x13, 0x13, 0x03, 0x33, 0x03, 0x13,
0x21, 0x31, 0x41, 0x11, 0x11, 0x11, 0x01, 0x31, 0x01, 0x11,
0x27, 0x37, 0x47, 0x17, 0x17, 0x17, 0x07, 0x37, 0x07, 0x17,
0x21, 0x31, 0x41, 0x11, 0x11, 0x11, 0x01, 0x31, 0x01, 0x11,
0x23, 0x33, 0x43, 0x13, 0x13, 0x13, 0x03, 0x33, 0x03, 0x13,*/
};
const uint8 lcd_table3 = {
//0 1 2 3 4 5 6 7 8 9
0x17, 0x37, 0x17, 0x17, 0x37, 0x17, 0x17, 0x37, 0x17, 0x17,
0x17, 0x37, 0x17, 0x17, 0x37, 0x17, 0x17, 0x37, 0x17, 0x17,
0x13, 0x33, 0x13, 0x13, 0x33, 0x13, 0x13, 0x33, 0x13, 0x13,
0x13, 0x33, 0x13, 0x13, 0x33, 0x13, 0x13, 0x33, 0x13, 0x13,
0x17, 0x37, 0x17, 0x17, 0x37, 0x17, 0x17, 0x37, 0x17, 0x17,
0x13, 0x33, 0x13, 0x13, 0x33, 0x13, 0x13, 0x33, 0x13, 0x13,
0x13, 0x33, 0x13, 0x13, 0x33, 0x13, 0x13, 0x33, 0x13, 0x13,
0x17, 0x37, 0x17, 0x17, 0x37, 0x17, 0x17, 0x37, 0x17, 0x17,
0x13, 0x33, 0x13, 0x13, 0x33, 0x13, 0x13, 0x33, 0x13, 0x13,
0x13, 0x33, 0x13, 0x13, 0x33, 0x13, 0x13, 0x33, 0x13, 0x13,
0x11, 0x31, 0x11, 0x11, 0x31, 0x11, 0x11, 0x31, 0x11, 0x11,
0x15, 0x35, 0x15, 0x15, 0x35, 0x15, 0x15, 0x35, 0x15, 0x15,
0x11, 0x31, 0x11, 0x11, 0x31, 0x11, 0x11, 0x31, 0x11, 0x11,
0x11, 0x31, 0x11, 0x11, 0x31, 0x11,/* 0x11, 0x31, 0x11, 0x11,
0x15, 0x35, 0x15, 0x15, 0x35, 0x15, 0x15, 0x35, 0x15, 0x15,
0x11, 0x31, 0x11, 0x11, 0x31, 0x11, 0x11, 0x31, 0x11, 0x11,
0x11, 0x31, 0x11, 0x11, 0x31, 0x11, 0x11, 0x31, 0x11, 0x11,
0x15, 0x35, 0x15, 0x15, 0x35, 0x15, 0x15, 0x35, 0x15, 0x15,
0x11, 0x31, 0x11, 0x11, 0x31, 0x11, 0x11, 0x31, 0x11, 0x11,
0x11, 0x31, 0x11, 0x11, 0x31, 0x11, 0x11, 0x31, 0x11, 0x11,
*/
};
//512+temp_ad_0_25
const uint8 temp_ad_0_25 = {
//01 2 3 4 5 6 7 8 9
246,237,228,219,209,200,190,181,171,161,
151,141,131,121,111,101,91,81,70,60,
50,40,30,20,10,0,
};
//256+temp_ad_26_56
const uint8 temp_ad_26_56 = {
//01 2 3 4 5 6 7 8 9
246,236,227,217,207,198,188,179,170,161,
152,143,134,126,117,109,101,93,85,77,
69,62,54,47,40,33,26,19,13,6,
0,
};
const uint8 temp_ad_57_135 = {
250,244,238,
232,227,221,216,211,205,200,196,191,186,
182,177,173,169,165,161,157,153,149,145,
142,139,135,132,129,126,123,120,117,114,
111,109,106,104,101,99,96,94,92,90,
88,86,84,82,80,78,76,75,73,71,
70,68,67,65,64,62,61,60,58,57,
56,54,53,52,51,50,49,48,47,46,
45,44,43,42,41,40
};
section2 uint16 ADC_VOL1;
section2 uint16 adc_temp;
section2 uint16 adc_array;
section2 uint8 bt_level;
section2 uint8 temp_value;
section2 uint8 temp_value_new;
section2 uint8 temp_count;
section2 uint8 temp_j;
static volatile unsigned char section0 lcd_dg1 @ 0x1F ;
static volatile section0 sbit lcd_dg1_7 @ (unsigned) &lcd_dg1 * 8 + 7 ;
static volatile section0 sbit lcd_dg1_6 @ (unsigned) &lcd_dg1 * 8 + 6 ;
static volatile section0 sbit lcd_dg1_5 @ (unsigned) &lcd_dg1 * 8 + 5 ;
static volatile section0 sbit lcd_dg1_4 @ (unsigned) &lcd_dg1 * 8 + 4 ;
static volatile section0 sbit lcd_dg1_3 @ (unsigned) &lcd_dg1 * 8 + 3 ;
static volatile section0 sbit lcd_dg1_2 @ (unsigned) &lcd_dg1 * 8 + 2 ;
static volatile section0 sbit lcd_dg1_1 @ (unsigned) &lcd_dg1 * 8 + 1 ;
static volatile section0 sbit lcd_dg1_0 @ (unsigned) &lcd_dg1 * 8 + 0 ;
#define BATTERY_HIGH 803
#define BATTERY_MID 722
#define BATTERY_LOW 642
#define LED_ON 0
#define LED_OFF 1
void Clr_Ram_Asm()
{
__asm{
LCALL 0X3FF
MOVA CALR
BCC PSW,RP0
MOVI 0X10 ;//清除存储组0的RAM数据
MOVA IAA ;指针初始化
CLR_BANK0
CLR IAD ;//清0指针指向地址的数据
INC IAA ;指针加1
JBS IAA,5
JUMP CLR_BANK0
MOVI 0X30 ;//清除存储组1的RAM数据
MOVA IAA
CLR_BANK1
CLR IAD
INC IAA
JBS IAA,6
JUMP CLR_BANK1
MOVI 0X50 ;//清除存储组2的RAM数据
MOVA IAA
CLR_BANK2
CLR IAD
INC IAA
JBS IAA,5
JUMP CLR_BANK2
MOVI 0X70 ;//清除存储组3的RAM数据
MOVA IAA
CLR_BANK3
CLR IAD
INC IAA
JBS IAA,7
JUMP CLR_BANK3
CLR IAA
};
}
void Init_Config()
{
__asm{
MOVI B'00100010'
TRIS PA
MOVI B'00000001'
TRIS PB
};
PA = 0B00011100;
PB = 0B00000000;
bt_level = 1;
}
//温度
void get_adc_ch1()
{
ADCC2 = 0x03;
ADCC1 = 0xA0;
ADCC0 = 0x85;
GO_DONE = 1;
while(1 == GO_DONE)
{
__Asm CWDT;
}
ADC_VOL1 = ((ADCRH&0X03)<<8) + ADCRL;
}
void show_led_bg()
{
if(1 == bt_level) //<32,绿色
{
LED_RED = LED_OFF;
LED_GREEN = LED_ON;
LED_BLUE = LED_OFF;
}
else if(2 == bt_level) //蓝色
{
LED_RED = LED_OFF;
LED_GREEN = LED_OFF;
LED_BLUE = LED_ON;
}
else if(3 == bt_level) //>40,红色
{
LED_RED = LED_ON;
LED_GREEN = LED_OFF;
LED_BLUE = LED_OFF;
}
}
void delay(uint16 n)
{
while(n)
{
__Asm CWDT;
n--;
}
}
void set_lcd_seg()
{
LCD_SEG1 = lcd_dg1_1;
LCD_SEG2 = lcd_dg1_2;
LCD_SEG3 = lcd_dg1_3;
LCD_SEG4 = lcd_dg1_4;
LCD_SEG5 = lcd_dg1_5;
LCD_SEG6 = lcd_dg1_6;
LCD_SEG7 = lcd_dg1_7;
delay(100);
}
void show_number()
{
__asm{
MOVI B'01100001'
TRIS PB
}
lcd_dg1 = lcd_table1;
LCD_P1 = 1;
set_lcd_seg();
lcd_dg1 = ~lcd_table1;
LCD_P1 = 0;
set_lcd_seg();
__asm{
MOVI B'10100001'
TRIS PB
}
lcd_dg1 = lcd_table2;
LCD_P2 = 1;
set_lcd_seg();
lcd_dg1 = ~lcd_table2;
LCD_P2 = 0;
set_lcd_seg();
__asm{
MOVI B'11000001'
TRIS PB
}
lcd_dg1 = lcd_table3;
LCD_P3 = 1;
set_lcd_seg();
lcd_dg1 = ~lcd_table3;
LCD_P3 = 0;
set_lcd_seg();
}
void main()
{
Clr_Ram_Asm(); //清RAM
__Asm CWDT;
Init_Config();
temp_value = 0;
while(1)
{
__Asm CWDT;
get_adc_ch1();
if(ADC_VOL1 >= 512)
{
adc_temp = ADC_VOL1-512;
for(temp_j = 0; temp_j<26; temp_j++)
{
adc_array = temp_ad_0_25;
if(adc_temp >= adc_array)
{
break;
}
}
temp_value_new = temp_j;
}
else if(ADC_VOL1 >=256)
{
adc_temp = ADC_VOL1-256;
for(temp_j = 0; temp_j<31; temp_j++)
{
adc_array = temp_ad_26_56;
if(adc_temp >= adc_array)
{
break;
}
}
temp_value_new = temp_j+26;
}
else
{
adc_temp = ADC_VOL1;
for(temp_j = 0; temp_j<79; temp_j++)
{
adc_array = temp_ad_57_135;
if(adc_temp >= adc_array)
{
break;
}
}
temp_value_new = temp_j+58;
}
if(temp_value_new>135)
temp_value_new = 135;
if(temp_value_new == temp_value)
{
temp_count = 0;
}
else
{
temp_count++;
}
if(temp_count >= 50)
{
temp_value = temp_value_new;
}
if(temp_value >= 40)
{
bt_level = 3;
}
else if(temp_value >= 33)
{
bt_level = 2;
}
else
{
bt_level = 1;
}
show_led_bg();
show_number();
}
}
插入图片 不知道哪里有卖海尔单片机和开发板的?都是用汇编操作的? 申请参加开源活动,送十片片子加个仿真器 yanmaishuilei 发表于 2013-8-23 17:59 static/image/common/back.gif
申请参加开源活动,送十片片子加个仿真器
请到海尔单片机开源项目专题贴下载报名表格,填写信息提交给我们。
我们审核通过后会邮寄开发套件给你的。
页:
[1]