|
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Evaluation
http://www.hpinfotech.com
Project : TM1628-数码管驱动程序 (CVAVR 2.05)
Version : VER 1.0
Date : 2011-02-01
Author : SPC
Company : YANTAI
Comments:
Chip type : ATmega8L
Program type : Application
Clock frequency : 1 MHz (内置默认熔丝位1M)
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega8.h>
#include <delay.h>
#define uchar unsigned char //字符类型转定义
#define uint unsigned int //字符类型转定义
//定义端口
#define TM_STB PORTC.3
#define TM_CLK PORTC.2
#define TM_DIO PORTC.1
#define TM_DIO_P PINC.1
//定义数组
uchar TAB_keynum[5]; //这5个数据来保存键值
#define knum1 TAB_keynum[0]
#define knum2 TAB_keynum[1]
#define knum3 TAB_keynum[2]
#define knum4 TAB_keynum[3]
#define knum5 TAB_keynum[4]
//共阴的数码管表格
//因为接法不同,如果显示乱码,请更新成自己的LED对应数据表
unsigned char TAB_duan[]={0xeb,0x88,0xd3,0xda,0xb8,0x7a,0x7b,0xc8,0xfb,0xfa,0xf9,0x3b,0x63,0x9b,0x73,0x71,0xb9,0x39,0x23,0x19,0xe9,0x1b,0xf1,0x11,0x33,0xab,0x10};
//0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F,H,h,L,n,N,o,P,r,t,U,-,
/*********************************************************/
/* 初始化 */
/*********************************************************/
void TM1628_init()
{
DDRC.3=1; //端口设置为输出
DDRC.2=1; //端口设置为输出
DDRC.1=1; //端口设置为输出
TM_DIO=1;
TM_STB=1;
TM_CLK=1;
}
/*********************************************************/
/* 发送8位 */
/*********************************************************/
void WR_TM1628_Byte(uchar TM_dat)
{
uchar i;
for(i=0;i<8;i++)
{
TM_DIO=TM_dat&0x01;//强制转成:位,低位先发送
TM_CLK=0; //
TM_dat>>=1; //数据右移位
TM_CLK=1; //
}
}
/*********************************************************/
/* 发送指令 */
/*********************************************************/
void Wr_TM_CMD(uchar TMcmd)
{
TM_STB=0; //片选,0有效
WR_TM1628_Byte(TMcmd);
TM_STB=1; //片选,1无效
TM_DIO=1;
}
/*********************************************************/
/* 读按键的位子函数 */
/*********************************************************/
uchar Read_TM_Byte()
{
uchar i,k;
for(i=0;i<8;i++)
{
TM_CLK=0;
k=k>>1;
if(TM_DIO_P==1){k|=0x80;}//1000 0000
TM_CLK=1;
}
return (k);
}
/*********************************************************/
/* 读按键数值 */
/*********************************************************/
void Read_keynumber()//读TM1628的key值并入5个数组里面
{
uchar i;
TM_STB=0; //片选,0有效
WR_TM1628_Byte(0x42);//读键值命令0x42
DDRC.1=0; //置DIO端口为输入状态
TM_DIO=1; //置高
for(i=0;i<5;i++)
{
TAB_keynum=Read_TM_Byte();//读key值
}
TM_STB=1; //片选,置高,无效
DDRC.1=1; //端口状态恢复为输出
}
/***************************************************************/
/* 显示程序 5位,可以加到7位 */
/*前4个是数码管,第五位管工作指示灯*/
/***************************************************************/
void TM1628_display(uchar dat1,uchar dat2,uchar dat3,uchar dat4,uchar dat5)
{
Wr_TM_CMD(0x03);//显示模式
Wr_TM_CMD(0x40);//地址自动加一
TM_STB=0; //片选,0有效
WR_TM1628_Byte(0xc0);//地址0开始
WR_TM1628_Byte(dat4);
WR_TM1628_Byte(0xff);
WR_TM1628_Byte(dat1);
WR_TM1628_Byte(0xff);
WR_TM1628_Byte(dat2);
WR_TM1628_Byte(0xff);
WR_TM1628_Byte(dat3);
WR_TM1628_Byte(0xff);
WR_TM1628_Byte(dat5); //0x01-led1;0x02-led2;0x04-led3;0x08-led4
WR_TM1628_Byte(0xff); //led工作灯总开关
TM_STB=1; //片选,置高无效
Wr_TM_CMD(0x88); //显示开
}
/*********************************************************/
/* 主程序 */
/*********************************************************/
void main(void)
{
delay_ms(300); //延时启动
TM1628_init(); //初始化
//显示“12345”数字
TM1628_display(TAB_duan[1],TAB_duan[2],TAB_duan[3],TAB_duan[4],TAB_duan[5]);
delay_ms(1000);
while(1)
{
Read_keynumber(); //读键值
//显示读出的键值
TM1628_display(TAB_duan[knum1],TAB_duan[knum2],TAB_duan[knum3],TAB_duan[knum4],TAB_duan[knum5]);
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|