咔咔特 发表于 2013-3-22 16:18:50

海尔单片机 I/O直接驱动LCD显示的方法和代码实例

本帖最后由 咔咔特 于 2013-3-22 16:28 编辑

    低成本的应用方案中,一般较少的段位数的LCD显示,都直接使用通用的I/O直接驱动段位的LCD。
比如直发器的应用中,3位数码及其他图标显示的LCD,一般是4COMx8SEG内的连线。本贴给出原理图和LCD驱动实例。供参考。


咔咔特 发表于 2013-3-22 16:24:19

本帖最后由 咔咔特 于 2013-3-22 16:25 编辑

原理图


(不知如何贴图,把文件上传进来了)

咔咔特 发表于 2013-3-22 16:26:33

本帖最后由 咔咔特 于 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:38:24

咔咔特 发表于 2013-3-22 16:24 static/image/common/back.gif
原理图




不错的帖子! 点击发帖子的界面图片选择上传图片。

咔咔特 发表于 2013-3-22 17:15:11

本帖最后由 咔咔特 于 2013-3-22 17:16 编辑

补贴上原理图,需要得更清楚,请下载PDF文件。

zhvdoo 发表于 2013-3-22 18:29:29

我也来贴一个用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();
               
        }
}


zhvdoo 发表于 2013-3-22 18:32:25

插入图片

tjCFeng 发表于 2013-3-22 20:39:45

不知道哪里有卖海尔单片机和开发板的?都是用汇编操作的?

yanmaishuilei 发表于 2013-8-23 17:59:57

申请参加开源活动,送十片片子加个仿真器

海尔_小海 发表于 2013-8-26 11:19:31

yanmaishuilei 发表于 2013-8-23 17:59 static/image/common/back.gif
申请参加开源活动,送十片片子加个仿真器

请到海尔单片机开源项目专题贴下载报名表格,填写信息提交给我们。
我们审核通过后会邮寄开发套件给你的。
页: [1]
查看完整版本: 海尔单片机 I/O直接驱动LCD显示的方法和代码实例