|
TM1640是驅動數碼管的專用集成電路,可以直接驅動16位共陰數碼管,手冊請下載附件。
/*******************************
*本程序直接驅動16位共陰數碼管,各數碼管分別驅動0、1、2、……E、F。
*/
#include <pic.h> //PIC12F629
__CONFIG(0x3F84);
#define clk GPIO0 //時鐘信號
#define dio GPIO1 //數據/地址數據
#define uchar unsigned char
#define uint unsigned int
//共陰極數碼管
const uchar SEGData[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};//1-9-F-不輸出
//uchar weidata[4];//位變量
//uchar timecnt,keyzh,dpFlag = 0; //控制第二個數碼管的dp的顯示
//char time, sec;
void init(void);
void Delay_us(uint); //nus 延時
void tm1640_start(void);//1640開始
void tm1640_stop(void); //1640停止
void tm1640_wrbyte(uchar); //寫一個字節
void tm1640_display(void); //寫顯示寄存器 并開顯示
///=============================================
void main(void)
{
init(); //初始化
while(1)
{
tm1640_display(); //寫寄存器并開顯示
}
}
///=======================================
void Delay_us(uint i) //nus 延時
{
uchar x;
for(;i>0;i--)
for(x=0;x<3;x++) asm("NOP");
}
///======================================
void tm1640_start(void) //1640開始
{
clk=1;
dio=1;
Delay_us(2);
dio = 0;
}
void tm1640_stop(void) //1640停止
{
clk = 0;
Delay_us(2);
dio = 0;
Delay_us(2);
clk = 1;
Delay_us(2);
dio = 1;
}
//=========================
void tm1640_wrbyte(uchar oneByte) //寫一個字節
{
uchar i;
for(i=0;i<8;i++)
{
clk = 0;
Delay_us(2);
if(oneByte&0x01) dio = 1; //低位在前
else dio = 0;
Delay_us(3);
oneByte=oneByte>>1;
clk=1;
Delay_us(3);
}
}
//======================
void tm1640_display(void) //寫顯示寄存器 并開顯示
{
uchar i;
tm1640_start();
tm1640_wrbyte(0x40);// 40H 地址自動加 1 模式,44H 固定地址模式,本程序采用自加 1 模式
tm1640_stop();
tm1640_start();
tm1640_wrbyte(0xc0);//設置首地址
for(i=0;i<16;i++)//地址自加,不必每次都寫地址。
{
tm1640_wrbyte(SEGData[i]); //送數據
}
tm1640_stop();
tm1640_start();
tm1640_wrbyte(0x8a);//開顯示 ,亮度:14/16
tm1640_stop();
}
///================================================
void init(void) //初始化程序
{
OPTION=0x80; //禁止弱上拉
WPU= 0x00; //關閉弱上拉
INTCON = 0X00; //開總中斷和T1中斷
TRISIO=0x08; //IO 口做輸出
//IOCB = 0X00; //電平變化觸發中斷;全關
CMCON=0x07; // 設置全部為普通數字IO口 關閉所有比較器
GPIO=0x08; //端口0 輸出低電平
}
|
評分
-
查看全部評分
|