#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);
}
}