新茂单片机+TM1621_初始化程序

#include "SM59R16A5C.h"
#include "intrins.h"  // 包含nop指令头文件

#define uchar unsigned char  // 数据类型宏定义
#define uint unsigned int    // 数据类型宏定义

#define nop _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); // 宏定义

/****************** TM1621 模块命令定义 *********************/
#define SYSDIS   0x00    // 关系统振荡器和LCD偏压发生器    
#define SYSEN    0x02    // 打开系统振荡器
#define LCDOFF   0x04    // 关LCD偏压
#define LCDON    0x06    // 开LCD偏压
#define TONEON   0x12    // 打开声音输出
#define TONEOFF  0x10    // 关闭声音输出
#define XTAL     0x28    // 外部接晶振                                 
#define RC       0x30    // 内部RC振荡    
#define BIAS     0x52    // 1/3偏压 4公共口    
#define WDTDIS   0x0a    // 禁止看门狗
#define WDTEN    0x0e    // 开启看门狗

/******************** 定义控制端口 **********************/
sbit CS = P2^7;
sbit WRITE = P2^6;
sbit DATA = P0^6;

/******************** 定义数据 *************************/
uchar code Smg1[10] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0x00,0x00,0xDF};  // 全亮字型
uchar code Smg2[10] = {0xFD, 0x60, 0xBE, 0x7A, 0xE3, 0x5B, 0xDF, 0x70, 0xFF, 0x7B};  // 0~9 字型码
//uchar code Smg2_2[10] = {0xFD, 0x60, 0xBE, 0xFA, 0xE3, 0xDB, 0xDF, 0xF0, 0xFF, 0xFB};  // 0~9 字型码
uchar  Smg3[10] = {0x00, 0x00, 0x00, 0x00,0x00,0x00,0xFF,0xFF,0x00,0xDF}; // 示例字形
uchar  Tab0[10] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00,0x00,0x00};  // 清屏

/******************** 延时函数 *************************/
void delay_nms(uint n) {
    uint i;
    while(n--)
        for(i = 0; i < 500; i++);
}

/******************** 从高位写入数据 *************************/
void Write_Data_H(uchar Data, uchar Cnt) {  // Data的高cnt位写入TM1621,高位在前
    uchar i;
    for(i = 0; i < Cnt; i++) {
        WRITE = 0;
        if(Data & 0x80)  // 从最高位发送
            DATA = 1;      
        else 
            DATA = 0;
        nop;
        nop;
        WRITE = 1;
        Data <<= 1;
    }
    WRITE = 0;
    DATA = 0;
}

/******************** 从低位写入数据 *************************/
void Write_Data_L(uchar Data, uchar Cnt) { // Data的低cnt位写入TM1621,低位在前 
    unsigned char i; 
    for(i = 0; i < Cnt; i++) { 
        WRITE = 0;
        if(Data & 0x01)    // 从低位发送
            DATA = 1;  
        else 
            DATA = 0; 
        nop;
        nop;
        WRITE = 1;
        Data >>= 1;
    } 
    WRITE = 0;
    DATA = 0;
} 

/******************** 写入控制命令 *************************/
void WriteCmd(uchar Cmd) {
    CS = 0;
    nop;
    Write_Data_H(0x80, 4);     // 写入命令标志 100
    Write_Data_H(Cmd, 8);      // 写入命令数据
    CS = 1;
    nop;
}

/********* 指定地址写入数据,实际写入后4位 ************/
void WriteOneData(uchar Addr, uchar Data) {
    CS = 0;
    Write_Data_H(0xa0, 3);     // 写入数据标志 101
    Write_Data_H(Addr << 2, 6);  // 写入地址数据
    Write_Data_L(Data, 4);     // 写入数据
    CS = 1;
    nop;
}

/********* 连续写入方式,每次数据为8位,写入数据 ************/
void WriteAllData(uchar Addr, uchar *p, uchar cnt) {
    uchar i;
    CS = 0;
    Write_Data_H(0xa0, 3);      // 写入数据标志 101
    Write_Data_H(Addr << 2, 6);  // 写入地址数据
    for(i = 0; i < cnt; i++) {  // 写入数据
        Write_Data_L(*p, 8);     
       // p++;
    }
    CS = 1;
    nop;
}
void WriteAllData2(uchar Addr, uchar *p, uchar cnt) {
    uchar i;
    CS = 0;
    Write_Data_H(0xa0, 3);      // 写入数据标志 101
    Write_Data_H(Addr << 2, 6);  // 写入地址数据
    for(i = 0; i < cnt; i++) {  // 写入数据
        Write_Data_L(*p++, 8);     
       // p++;
    }
    CS = 1;
    nop;
}


/******************* TM1621 初始化 **********************/
void TM1621_init() {
    CS = 1;
    WRITE = 1;
    DATA = 1;
    nop;
    delay_nms(1);            
    WriteCmd(BIAS);        // 1/3 偏压,4 公共口
    WriteCmd(RC);          // 内部 RC 振荡
    WriteCmd(SYSDIS);      // 关系统振荡器和 LCD 偏压发生器
    WriteCmd(WDTDIS);      // 禁止看门狗
    WriteCmd(SYSEN);       // 打开系统振荡器
    WriteCmd(LCDON);       // 开 LCD 偏压
}

void test_main() {
//    uchar j;
//		uchar k;
    TM1621_init();         // 开机初始化
    delay_nms(100);
    WriteAllData(0, Tab0, 7);  // LCD 不显示
    delay_nms(100);
    while(1) {
			
        WriteAllData(0, Smg1, 10);  // LCD 全显
        delay_nms(2000);
			
        WriteAllData(0, Tab0, 10);  // LCD 清屏
        delay_nms(2);
/********************************************************/				
			  WriteAllData(0, &Smg2[9], 6);  // 9
				delay_nms(1000);
			
			  WriteAllData(0, Tab0, 10);  // 清屏

			
				WriteAllData2(0,&Smg3[0],10);//字形
			  delay_nms(2);			
			  WriteAllData(0, &Smg2[8], 6);  //8+
				delay_nms(1000);
			
			  WriteAllData(0, Tab0, 10);  // 清屏
						
			  WriteAllData(0, &Smg2[7], 6);  // 7
				delay_nms(1000);
			
			  WriteAllData(0, Tab0, 10);  // 清屏
				
				WriteAllData2(0,&Smg3[0],10);//字形
			  delay_nms(2);			
			  WriteAllData(0, &Smg2[6], 6);  // 6+
				delay_nms(1000);
			
			  WriteAllData(0, Tab0, 10);  //清屏
			
			  WriteAllData(0, &Smg2[5], 6);  // 5
				delay_nms(1000);
			
			  WriteAllData(0, Tab0, 10);  // 清屏
				
				WriteAllData2(0,&Smg3[0],10);//字形
			  delay_nms(2);			
			  WriteAllData(0, &Smg2[4], 6);  // 4+
				delay_nms(1000);
			
			  WriteAllData(0, Tab0, 10);  // 清屏

			  WriteAllData(0, &Smg2[3], 6);  // 3
				delay_nms(1000);
			
			  WriteAllData(0, Tab0, 10);  //  清屏
				
				WriteAllData2(0,&Smg3[0],10);//字形
			  delay_nms(2);			
			  WriteAllData(0, &Smg2[2], 6);  // 2+
				delay_nms(1000);
			
			  WriteAllData(0, Tab0, 10);  // 清屏

		
			  WriteAllData(0, &Smg2[1], 6);  // 显示1
				delay_nms(1000);
			
			  WriteAllData(0, Tab0, 10);  // 清屏
				
				WriteAllData2(0,&Smg3[0],10);//字形
			  delay_nms(2);			
			  WriteAllData(0, &Smg2[0], 6);  // 0+
				delay_nms(1000);
			
			  WriteAllData(0, Tab0, 10);  //  清屏
        delay_nms(500);

        
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值