📄 ch452ldriver.s
字号:
.module ch452ldriver.c
.area text(rom, con, rel)
.dbfile G:\CH452L\ch452ldriver.c
.dbfunc e Init_Ch452lport _Init_Ch452lport fI
.even
_Init_Ch452lport::
.dbline -1
.dbline 71
; #include<iom8v.h>
; #include<macros.h>
; #include"delay.h"
;
; unsigned flag;
;
; /************************************************************************
; *说明:运行与CH452L的4线模式,MCU使用ATMEGA8L,MCU与CH452L引脚连接如下:
; LOAD PC0
; DCLK PC1
; DIN PC2
; DOUT PD2()INT0
; LOAD,DCLK,DIN都为输出,DOUT为输入,若要使用其它IO口,只需更改如下宏定义即可
; *************************************************************************/
; #define PC0 0
; #define PC1 1
; #define PC2 2
; #define PD2 2
;
; #define LOAD_OUT DDRC |= BIT(PC0)
; #define LOAD_OUT0 PORTC &= ~BIT(PC0)
; #define LOAD_OUT1 PORTC |= BIT(PC0)
;
; #define DCLK_OUT DDRC |= BIT(PC1)
; #define DCLK_OUT0 PORTC &= ~BIT(PC1)
; #define DCLK_OUT1 PORTC |= BIT(PC1)
;
; #define DIN_OUT DDRC |= BIT(PC2)
; #define DIN_OUT0 PORTC &= ~BIT(PC2)
; #define DIN_OUT1 PORTC |= BIT(PC2)
;
; #define DOUT_IN DDRD &= ~BIT(PD2)
; #define DOUT_OUT0 PORTD &= ~BIT(PD2)
; #define DOUT_OUT1 PORTD |= BIT(PD2)
; #define DOUT_PIN PIND & 0x04
;
; /*************************************************************************
; *宏定义CH452L系统命令
; *************************************************************************/
; #define RESET_CHIP 0x0201
; #define OPEN_DISPLAY 0x0401 //开启显示
; #define OPEN_KEYBOARD 0x0422 //开启键盘
; #define OPEN_DISPLAY_KEYBOARD 0x0423 //开启显示和键盘
; #define DATA_LEFT 0x0300 //数据左移
; #define DATA_RIGHT 0x0302 //数据右移
; #define LEFT_CIRCLE 0x0301 //数据左循环
; #define RIGHT_CIRCLE 0x0303 //数据右循环
; #define READ_KEYCODE 0x0700 //读取按键代码
;
;
; /*************************************************************************
; *宏定义CH452L加载数据DIG7~DIG0
; * 说明:若要使用小数点,则只需将第7位置为1即可,例如0x0f80
; *************************************************************************/
; #define CH452L_DIG7 0x0f00
; #define CH452L_DIG6 0x0e00
; #define CH452L_DIG5 0x0d00
; #define CH452L_DIG4 0x0c00
; #define CH452L_DIG3 0x0b00
; #define CH452L_DIG2 0x0a00
; #define CH452L_DIG1 0x0900
; #define CH452L_DIG0 0x0800
;
; /**************************************************************************
; *函数名:初始化CH452L端口
; *函数功能:LOAD,DCLK,DIN都为输出,DOUT为输入
; *入口参数:无
; *出口参数:无
; **************************************************************************/
; int Init_Ch452lport(void)
; {
.dbline 72
; LOAD_OUT;
sbi 0x14,0
.dbline 73
; LOAD_OUT1;
sbi 0x15,0
.dbline 75
;
; DCLK_OUT;
sbi 0x14,1
.dbline 76
; DCLK_OUT1;
sbi 0x15,1
.dbline 78
;
; DIN_OUT;
sbi 0x14,2
.dbline 79
; DIN_OUT1;
sbi 0x15,2
.dbline 81
;
; DOUT_IN;
cbi 0x11,2
.dbline 82
; DOUT_OUT1;
sbi 0x12,2
.dbline 84
;
; Delay_Nus(30); //延时
ldi R16,30
ldi R17,0
rcall _Delay_Nus
.dbline 85
; return 0x31;
ldi R16,49
ldi R17,0
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Ch452l_Writecommand _Ch452l_Writecommand fV
; i -> R20
; command -> R22,R23
.even
_Ch452l_Writecommand::
rcall push_gset2
movw R22,R16
.dbline -1
.dbline 95
; }
;
; /**************************************************************************
; *函数名称:向CH452L写入命令函数
; *函数功能:
; *入口参数:定义一无符号整型变量存储12字节的命令字。
; *出口参数:无
; ***************************************************************************/
; void Ch452l_Writecommand(unsigned int command)
; {
.dbline 98
; unsigned char i;
;
; LOAD_OUT0;
cbi 0x15,0
.dbline 99
; Delay_Nus(2);
ldi R16,2
ldi R17,0
rcall _Delay_Nus
.dbline 100
; for(i=0;i<12;i++)
clr R20
rjmp L6
L3:
.dbline 101
; {
.dbline 102
; DCLK_OUT0;
cbi 0x15,1
.dbline 103
; if(command&0x0001==0x0001)
sbrs R22,0
rjmp L7
.dbline 104
; {
.dbline 105
; DIN_OUT1;
sbi 0x15,2
.dbline 106
; }
rjmp L8
L7:
.dbline 108
; else
; {
.dbline 109
; DIN_OUT0;
cbi 0x15,2
.dbline 110
; }
L8:
.dbline 111
lsr R23
ror R22
.dbline 112
sbi 0x15,1
.dbline 113
L4:
.dbline 100
inc R20
L6:
.dbline 100
cpi R20,12
brlo L3
.dbline 114
; command=command>>1;
; DCLK_OUT1;
; }
; LOAD_OUT1; //LOAD上升沿加载一帧数据
sbi 0x15,0
.dbline 115
; DIN_OUT1;
sbi 0x15,2
.dbline 116
; DCLK_OUT1;
sbi 0x15,1
.dbline -2
L2:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r command 22 i
.dbend
.dbfunc e Init_Ch452lsystem _Init_Ch452lsystem fI
.even
_Init_Ch452lsystem::
.dbline -1
.dbline 144
; }
;
; /**************************************************************************
; *函数名:Init_Ch452lsystem(void)
; *函数功能:初始化CH452L
; *命令说明:
; *(1)采用BCD译码方式显示设置显示参数命令:
; * 命令 显示位数
; * 0x0580 8
; * 0x0590 1
; * 0x05a0 2
; * 0x05b0 3
; * 0x05c0 4
; * 0x05d0 5
; * 0x05e0 6
; * 0x05f0 7
; *(2)OPEN_DISPLAY_KEYBOARD开启显示和键盘命令
; * 命令 开启 输出中断方式
; * 0x0401 显示 无(无键盘功能下不考虑)
; * 0x0402 键盘 低电平中断(不推荐用于测试)
; * 0x0422 键盘 边缘中断
; * 0x0403 显示和键盘 低电平中断(不推荐使用)
; * 0x0423 显示和键盘 边缘中断
; *入口参数:无
; *出口参数:无
; **************************************************************************/
; int Init_Ch452lsystem(void)
; {
.dbline 145
; Ch452l_Writecommand(RESET_CHIP);//芯片复位
ldi R16,513
ldi R17,2
rcall _Ch452l_Writecommand
.dbline 146
; Delay_Nus(40);
ldi R16,40
ldi R17,0
rcall _Delay_Nus
.dbline 148
;
; Ch452l_Writecommand(OPEN_DISPLAY_KEYBOARD);//开启显示和键盘,边缘中断
ldi R16,1059
ldi R17,4
rcall _Ch452l_Writecommand
.dbline 149
; Delay_Nus(5);
ldi R16,5
ldi R17,0
rcall _Delay_Nus
.dbline 150
; return 0x32;
ldi R16,50
ldi R17,0
.dbline -2
L9:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Display_Ch452lBCD _Display_Ch452lBCD fV
; i -> <dead>
; p -> R20,R21
; n -> R22
.even
_Display_Ch452lBCD::
rcall push_gset2
movw R20,R18
mov R22,R16
.dbline -1
.dbline 162
; }
;
; /***************************************************************************
; *函数名:
; *功能:
; *入口参数:
; n 要显示的数码管的位数
; *p 要显示的数码管的值,BCD码,在显示前将要显示的数码管的BCD码存入该数组
; *出口参数:
; ****************************************************************************/
; void Display_Ch452lBCD(unsigned char n,unsigned char *p)
; {
.dbline 164
; unsigned char i;
; switch(n)
clr R23
cpi R22,1
ldi R30,0
cpc R23,R30
breq L14
cpi R22,2
ldi R30,0
cpc R23,R30
breq L15
cpi R22,3
ldi R30,0
cpc R23,R30
breq L16
cpi R22,4
ldi R30,0
cpc R23,R30
breq L17
cpi R22,5
ldi R30,0
cpc R23,R30
breq L18
cpi R22,6
ldi R30,0
cpc R23,R30
brne X1
rjmp L19
X1:
cpi R22,7
ldi R30,0
cpc R23,R30
brne X2
rjmp L20
X2:
cpi R22,8
ldi R30,0
cpc R23,R30
brne X3
rjmp L21
X3:
rjmp L12
X0:
.dbline 165
; {
L14:
.dbline 167
; case(1):
; Ch452l_Writecommand(0x0590);//1位显示,BCD译码
ldi R16,1424
ldi R17,5
rcall _Ch452l_Writecommand
.dbline 168
; Delay_Nus(3);
ldi R16,3
ldi R17,0
rcall _Delay_Nus
.dbline 169
; break;
rjmp L12
L15:
.dbline 171
; case(2):
; Ch452l_Writecommand(0x05a0);//2位显示,BCD译码
ldi R16,1440
ldi R17,5
rcall _Ch452l_Writecommand
.dbline 172
; Delay_Nus(3);
ldi R16,3
ldi R17,0
rcall _Delay_Nus
.dbline 173
; break;
rjmp L12
L16:
.dbline 175
; case(3):
; Ch452l_Writecommand(0x05b0);//3位显示,BCD译码
ldi R16,1456
ldi R17,5
rcall _Ch452l_Writecommand
.dbline 176
; Delay_Nus(3);
ldi R16,3
ldi R17,0
rcall _Delay_Nus
.dbline 177
; break;
rjmp L12
L17:
.dbline 179
; case(4):
; Ch452l_Writecommand(0x05c0);//4位显示,BCD译码
ldi R16,1472
ldi R17,5
rcall _Ch452l_Writecommand
.dbline 180
; Delay_Nus(3);
ldi R16,3
ldi R17,0
rcall _Delay_Nus
.dbline 181
; break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -