⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch452l.lst

📁 ch452的数码管和键盘驱动程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
__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 + -