📄 ch452l.lst
字号:
__start:
__text_start:
0017 E5CF LDI R28,0x5F
0018 E0D4 LDI R29,4
0019 BFCD OUT 0x3D,R28
001A BFDE OUT 0x3E,R29
001B 51C0 SUBI R28,0x10
001C 40D0 SBCI R29,0
001D EA0A LDI R16,0xAA
001E 8308 STD Y+0,R16
001F 2400 CLR R0
0020 E6E8 LDI R30,0x68
0021 E0F0 LDI R31,0
0022 E010 LDI R17,0
0023 36EA CPI R30,0x6A
0024 07F1 CPC R31,R17
0025 F011 BEQ 0x0028
0026 9201 ST R0,Z+
0027 CFFB RJMP 0x0023
0028 8300 STD Z+0,R16
0029 E2E6 LDI R30,0x26
002A E0F0 LDI R31,0
002B E6A0 LDI R26,0x60
002C E0B0 LDI R27,0
002D E010 LDI R17,0
002E 32EE CPI R30,0x2E
002F 07F1 CPC R31,R17
0030 F021 BEQ 0x0035
0031 95C8 LPM
0032 9631 ADIW R30,1
0033 920D ST R0,X+
0034 CFF9 RJMP 0x002E
0035 D01C RCALL _main
_exit:
0036 CFFF RJMP _exit
FILE: G:\CH452L\main.c
(0001) #include<iom8v.h>
(0002) #include<macros.h>
(0003) #include"delay.h"
(0004) #include"ch452ldriver.h"
(0005)
(0006) /*******************************************************************
(0007) *函数名称:初始化串口
(0008) *函数功能:初始化USART为波特率9600,8bit数据,收发使能,接收中断允许
(0009) *入口参数:无
(0010) *出口参数:无
(0011) ******************************************************************/
(0012) int Init_Uart(void)
(0013) {
(0014) CLI(); //初始化USART时先关全局中断
_Init_Uart:
0037 94F8 BCLR 7
(0015) UCSRB = 0x00;
0038 2422 CLR R2
0039 B82A OUT 0x0A,R2
(0016) UCSRA = 0x00;
003A B82B OUT 0x0B,R2
(0017) UCSRC = BIT(URSEL) | 0x06;
003B E886 LDI R24,0x86
003C BD80 OUT 0x20,R24
(0018) UBRRL = 0x33; //设置波特率低位
003D E383 LDI R24,0x33
003E B989 OUT 0x09,R24
(0019) UBRRH = 0x00; //设置波特率高位
003F BC20 OUT 0x20,R2
(0020) UCSRB = 0x98;
0040 E988 LDI R24,0x98
0041 B98A OUT 0x0A,R24
(0021) SEI();
0042 9478 BSET 7
(0022) return 0x30;
0043 E300 LDI R16,0x30
0044 E010 LDI R17,0
0045 9508 RET
(0023) }
(0024)
(0025) /*************************************************
(0026) 函数名称:void Us0Transmit (unsigned char data)
(0027) 函数功能:发送数据
(0028) 入口参数:unsigned char data
(0029) 出口参数:无
(0030) *************************************************/
(0031) void Uart_Transmit (unsigned char data)
(0032) {
(0033) while ( !(UCSRA & (1<<UDRE))); //等待UDR为空
_Uart_Transmit:
data --> R16
0046 9B5D SBIS 0x0B,5
0047 CFFE RJMP _Uart_Transmit
(0034) UDR = data;
0048 B90C OUT 0x0C,R16
0049 9508 RET
_UartRxIsr:
004A 920A ST R0,-Y
004B B60F IN R0,0x3F
004C 920A ST R0,-Y
(0035) }
(0036)
(0037) //UART中断接收服务函数,形如 04 xx 02 xx (xx xx)
(0038) //其中04为接收的标志,02为接收的长度(可变),括号里的为数据
(0039) //接收成功后,置位Us0RCoF,接收到的数据保存在Us0BufRec中,保存的数据是整个数据包
(0040) #pragma interrupt_handler UartRxIsr:12
(0041) void UartRxIsr(void)
(0042) {
(0043) //unsigned char temp;
(0044) //temp = UDR; //取出数据
(0045) asm("nop");
004D 0000 NOP
004E 9009 LD R0,Y+
004F BE0F OUT 0x3F,R0
0050 9009 LD R0,Y+
0051 9518 RETI
(0046) }
(0047)
(0048) void main(void)
(0049) {
(0050) unsigned char temp,i;
(0051) Init_Int0();
_main:
i --> Y+1
temp --> R20
0052 D148 RCALL _Init_Int0
(0052) Delay_Nus(5);
0053 E005 LDI R16,5
0054 E010 LDI R17,0
0055 D02A RCALL _Delay_Nus
(0053) Init_Uart();
0056 DFE0 RCALL _Init_Uart
(0054) Delay_Nus(5);
0057 E005 LDI R16,5
0058 E010 LDI R17,0
0059 D026 RCALL _Delay_Nus
(0055) Init_Ch452lport();
005A D045 RCALL _Init_Ch452lport
(0056) Delay_Nus(5);
005B E005 LDI R16,5
005C E010 LDI R17,0
005D D022 RCALL _Delay_Nus
(0057) Init_Ch452lsystem();
005E D068 RCALL _Init_Ch452lsystem
(0058) Delay_Nms(1500);
005F ED0C LDI R16,0xDC
0060 E015 LDI R17,5
0061 D02A RCALL _Delay_Nms
(0059) Display_Ch452lBCD(8,BCDdata);
0062 E620 LDI R18,0x60
0063 E030 LDI R19,0
0064 E008 LDI R16,0x8
0065 D070 RCALL _Display_Ch452lBCD
(0060) Delay_Nms(20); //延时
0066 E104 LDI R16,0x14
0067 E010 LDI R17,0
0068 D023 RCALL _Delay_Nms
0069 C014 RJMP 0x007E
(0061)
(0062) while(1)
(0063) {
(0064) if(flag==1)
006A 91800068 LDS R24,flag
006C 91900069 LDS R25,flag+1
006E 3081 CPI R24,1
006F E0E0 LDI R30,0
0070 079E CPC R25,R30
0071 F461 BNE 0x007E
(0065) {
(0066) temp=Read_Keycode();
0072 D0F1 RCALL _Read_Keycode
0073 2F40 MOV R20,R16
(0067) Uart_Transmit(0x02);
0074 E002 LDI R16,2
0075 DFD0 RCALL _Uart_Transmit
(0068) Uart_Transmit(temp);
0076 2F04 MOV R16,R20
0077 DFCE RCALL _Uart_Transmit
(0069) flag=0;
0078 2422 CLR R2
0079 2433 CLR R3
007A 92300069 STS flag+1,R3
007C 92200068 STS flag,R2
007E CFEB RJMP 0x006A
007F 9508 RET
_Delay_Nus:
i --> R20
time --> R16
0080 D13D RCALL push_gset1
FILE: F:\CH452L\delay.c
(0001) #include<iom8v.h>
(0002) #include<macros.h>
(0003)
(0004) #define xtal 8 //定义时钟频率8M
(0005)
(0006) /************************************************************
(0007) * 函数名称:void Delay_Nus(unsigned int time)
(0008) * 功 能:软件延时N微秒
(0009) * 入口参数:time 延时时间
(0010) * 出口参数:无
(0011) ************************************************************/
(0012) void Delay_Nus(unsigned int time)
(0013) {
(0014) unsigned int i;
(0015) for(i=0;i<time;i++)
0081 2744 CLR R20
0082 2755 CLR R21
0083 C003 RJMP 0x0087
(0016) {
(0017) asm("nop");
0084 0000 NOP
0085 5F4F SUBI R20,0xFF
0086 4F5F SBCI R21,0xFF
0087 1740 CP R20,R16
0088 0751 CPC R21,R17
0089 F3D0 BCS 0x0084
008A D136 RCALL pop_gset1
008B 9508 RET
_Delay_Nms:
i --> R20
time --> R16
008C D131 RCALL push_gset1
(0018) }
(0019) }
(0020)
(0021) /************************************************************
(0022) * 函数名称:void Delay_Nms(unsigned int time)
(0023) * 功 能:软件延时N毫秒
(0024) * 入口参数:time 延时时间 MS
(0025) * 出口参数:无
(0026) ************************************************************/
(0027) void Delay_Nms(unsigned int time)
(0028) {
008D C009 RJMP 0x0097
(0029) unsigned int i;
(0030) while(time--)
(0031) {
(0032) for(i=1;i<(unsigned int)(xtal*143-2);i++)
008E E041 LDI R20,1
008F E050 LDI R21,0
0090 C002 RJMP 0x0093
0091 5F4F SUBI R20,0xFF
0092 4F5F SBCI R21,0xFF
0093 3746 CPI R20,0x76
0094 E0E4 LDI R30,4
0095 075E CPC R21,R30
0096 F3D0 BCS 0x0091
0097 0118 MOVW R2,R16
0098 5001 SUBI R16,1
0099 4010 SBCI R17,0
009A 2022 TST R2
009B F791 BNE 0x008E
009C 2033 TST R3
009D F781 BNE 0x008E
009E D122 RCALL pop_gset1
009F 9508 RET
FILE: G:\CH452L\ch452ldriver.c
(0001) #include<iom8v.h>
(0002) #include<macros.h>
(0003) #include"delay.h"
(0004)
(0005) unsigned flag;
(0006)
(0007) /************************************************************************
(0008) *说明:运行与CH452L的4线模式,MCU使用ATMEGA8L,MCU与CH452L引脚连接如下:
(0009) LOAD PC0
(0010) DCLK PC1
(0011) DIN PC2
(0012) DOUT PD2()INT0
(0013) LOAD,DCLK,DIN都为输出,DOUT为输入,若要使用其它IO口,只需更改如下宏定义即可
(0014) *************************************************************************/
(0015) #define PC0 0
(0016) #define PC1 1
(0017) #define PC2 2
(0018) #define PD2 2
(0019)
(0020) #define LOAD_OUT DDRC |= BIT(PC0)
(0021) #define LOAD_OUT0 PORTC &= ~BIT(PC0)
(0022) #define LOAD_OUT1 PORTC |= BIT(PC0)
(0023)
(0024) #define DCLK_OUT DDRC |= BIT(PC1)
(0025) #define DCLK_OUT0 PORTC &= ~BIT(PC1)
(0026) #define DCLK_OUT1 PORTC |= BIT(PC1)
(0027)
(0028) #define DIN_OUT DDRC |= BIT(PC2)
(0029) #define DIN_OUT0 PORTC &= ~BIT(PC2)
(0030) #define DIN_OUT1 PORTC |= BIT(PC2)
(0031)
(0032) #define DOUT_IN DDRD &= ~BIT(PD2)
(0033) #define DOUT_OUT0 PORTD &= ~BIT(PD2)
(0034) #define DOUT_OUT1 PORTD |= BIT(PD2)
(0035) #define DOUT_PIN PIND & 0x04
(0036)
(0037) /*************************************************************************
(0038) *宏定义CH452L系统命令
(0039) *************************************************************************/
(0040) #define RESET_CHIP 0x0201
(0041) #define OPEN_DISPLAY 0x0401 //开启显示
(0042) #define OPEN_KEYBOARD 0x0422 //开启键盘
(0043) #define OPEN_DISPLAY_KEYBOARD 0x0423 //开启显示和键盘
(0044) #define DATA_LEFT 0x0300 //数据左移
(0045) #define DATA_RIGHT 0x0302 //数据右移
(0046) #define LEFT_CIRCLE 0x0301 //数据左循环
(0047) #define RIGHT_CIRCLE 0x0303 //数据右循环
(0048) #define READ_KEYCODE 0x0700 //读取按键代码
(0049)
(0050)
(0051) /*************************************************************************
(0052) *宏定义CH452L加载数据DIG7~DIG0
(0053) * 说明:若要使用小数点,则只需将第7位置为1即可,例如0x0f80
(0054) *************************************************************************/
(0055) #define CH452L_DIG7 0x0f00
(0056) #define CH452L_DIG6 0x0e00
(0057) #define CH452L_DIG5 0x0d00
(0058) #define CH452L_DIG4 0x0c00
(0059) #define CH452L_DIG3 0x0b00
(0060) #define CH452L_DIG2 0x0a00
(0061) #define CH452L_DIG1 0x0900
(0062) #define CH452L_DIG0 0x0800
(0063)
(0064) /**************************************************************************
(0065) *函数名:初始化CH452L端口
(0066) *函数功能:LOAD,DCLK,DIN都为输出,DOUT为输入
(0067) *入口参数:无
(0068) *出口参数:无
(0069) **************************************************************************/
(0070) int Init_Ch452lport(void)
(0071) {
(0072) LOAD_OUT;
_Init_Ch452lport:
00A0 9AA0 SBI 0x14,0
(0073) LOAD_OUT1;
00A1 9AA8 SBI 0x15,0
(0074)
(0075) DCLK_OUT;
00A2 9AA1 SBI 0x14,1
(0076) DCLK_OUT1;
00A3 9AA9 SBI 0x15,1
(0077)
(0078) DIN_OUT;
00A4 9AA2 SBI 0x14,2
(0079) DIN_OUT1;
00A5 9AAA SBI 0x15,2
(0080)
(0081) DOUT_IN;
00A6 988A CBI 0x11,2
(0082) DOUT_OUT1;
00A7 9A92 SBI 0x12,2
(0083)
(0084) Delay_Nus(30); //延时
00A8 E10E LDI R16,0x1E
00A9 E010 LDI R17,0
00AA DFD5 RCALL _Delay_Nus
(0085) return 0x31;
00AB E301 LDI R16,0x31
00AC E010 LDI R17,0
00AD 9508 RET
_Ch452l_Writecommand:
i --> R20
command --> R22
00AE D10D RCALL push_gset2
00AF 01B8 MOVW R22,R16
(0086) }
(0087)
(0088) /**************************************************************************
(0089) *函数名称:向CH452L写入命令函数
(0090) *函数功能:
(0091) *入口参数:定义一无符号整型变量存储12字节的命令字。
(0092) *出口参数:无
(0093) ***************************************************************************/
(0094) void Ch452l_Writecommand(unsigned int command)
(0095) {
(0096) unsigned char i;
(0097)
(0098) LOAD_OUT0;
00B0 98A8 CBI 0x15,0
(0099) Delay_Nus(2);
00B1 E002 LDI R16,2
00B2 E010 LDI R17,0
00B3 DFCC RCALL _Delay_Nus
(0100) for(i=0;i<12;i++)
00B4 2744 CLR R20
00B5 C00A RJMP 0x00C0
(0101) {
(0102) DCLK_OUT0;
00B6 98A9 CBI 0x15,1
(0103) if(command&0x0001==0x0001)
00B7 FF60 SBRS R22,0
00B8 C002 RJMP 0x00BB
(0104) {
(0105) DIN_OUT1;
00B9 9AAA SBI 0x15,2
(0106) }
00BA C001 RJMP 0x00BC
(0107) else
(0108) {
(0109) DIN_OUT0;
00BB 98AA CBI 0x15,2
(0110) }
(0111) command=command>>1;
00BC 9576 LSR R23
00BD 9567 ROR R22
(0112) DCLK_OUT1;
00BE 9AA9 SBI 0x15,1
00BF 9543 INC R20
00C0 304C CPI R20,0xC
00C1 F3A0 BCS 0x00B6
(0113) }
(0114) LOAD_OUT1; //LOAD上升沿加载一帧数据
00C2 9AA8 SBI 0x15,0
(0115) DIN_OUT1;
00C3 9AAA SBI 0x15,2
(0116) DCLK_OUT1;
00C4 9AA9 SBI 0x15,1
00C5 D0EC RCALL pop_gset2
00C6 9508 RET
(0117) }
(0118)
(0119) /**************************************************************************
(0120) *函数名:Init_Ch452lsystem(void)
(0121) *函数功能:初始化CH452L
(0122) *命令说明:
(0123) *(1)采用BCD译码方式显示设置显示参数命令:
(0124) * 命令 显示位数
(0125) * 0x0580 8
(0126) * 0x0590 1
(0127) * 0x05a0 2
(0128) * 0x05b0 3
(0129) * 0x05c0 4
(0130) * 0x05d0 5
(0131) * 0x05e0 6
(0132) * 0x05f0 7
(0133) *(2)OPEN_DISPLAY_KEYBOARD开启显示和键盘命令
(0134) * 命令 开启 输出中断方式
(0135) * 0x0401 显示 无(无键盘功能下不考虑)
(0136) * 0x0402 键盘 低电平中断(不推荐用于测试)
(0137) * 0x0422 键盘 边缘中断
(0138) * 0x0403 显示和键盘 低电平中断(不推荐使用)
(0139) * 0x0423 显示和键盘 边缘中断
(0140) *入口参数:无
(0141) *出口参数:无
(0142) **************************************************************************/
(0143) int Init_Ch452lsystem(void)
(0144) {
(0145) Ch452l_Writecommand(RESET_CHIP);//芯片复位
_Init_Ch452lsystem:
00C7 E001 LDI R16,1
00C8 E012 LDI R17,2
00C9 DFE4 RCALL _Ch452l_Writecommand
(0146) Delay_Nus(40);
00CA E208 LDI R16,0x28
00CB E010 LDI R17,0
00CC DFB3 RCALL _Delay_Nus
(0147)
(0148) Ch452l_Writecommand(OPEN_DISPLAY_KEYBOARD);//开启显示和键盘,边缘中断
00CD E203 LDI R16,0x23
00CE E014 LDI R17,4
00CF DFDE RCALL _Ch452l_Writecommand
(0149) Delay_Nus(5);
00D0 E005 LDI R16,5
00D1 E010 LDI R17,0
00D2 DFAD RCALL _Delay_Nus
(0150) return 0x32;
00D3 E302 LDI R16,0x32
00D4 E010 LDI R17,0
00D5 9508 RET
_Display_Ch452lBCD:
i --> Y+1
p --> R20
n --> R22
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -