?? display_led._c
字號:
//******************************************************************************
// *
// FileName : 擴展板ledspi.c ICCAVR V6.31A編譯 *
// Function : 高檔LED顯示屏,滾動顯示一個數組 *
// Date : 2006-11-24 *
// Version : 1.0 *
// *
// Author : 開關電源 hongtusy@163.com *
// Company : 電子信息技術資源網 http://www.itsn.cn *
// *
/***************************描述與記事******************************************
擴展實驗板的AVR程序,使用595驅動點陣漢字LED的練習。
記事:本程序旨在對漢字LED驅動的理解與演示,程序適合初學者使用。
描述:74HC595是串行輸入,并行輸出帶鎖存器的有較大驅動能力的芯片。驅動電流可達70mA。內部有移位和輸出兩個寄存器。
在SRCLK串行時鐘上升沿,數據經SER移位進入,或經QH’輸出。在RCLK上升沿,數據進入并行輸出寄存器。
SRCLK’和OE’分別是復位和允許輸出控制,分別接電源和地。
接線定義:PD4=數據,PD5=RCLK并行輸出時鐘,PD6=SRCLK串行時鐘,PD7=OE,PD0=A,PD1=B,PD2=C,PD3=D
//******************************************************************************/
#include <iom8535v.h> //頭文件,使用ATmega8535單片機
#include <macros.h> //包含一些常用的宏定義,如NOP(),SEI()等。
typedef unsigned char uchar; //數據類型說明,無符號整型,兩字節大小。
typedef unsigned int uint; //數據類型說明,無符號字符型,單字節大小。
//使用片內1MHz晶體,可更換。
#pragma data: code
//歡迎 ,先上后下,先左后右取碼,每字32個字節 ,此表格存儲在程序存儲器中
const uchar buf[608]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //空
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //空
0x28,0x04,0x24,0x08,0x22,0x32,0x21,0xC2,0x26,0xC2,0x38,0x34,
0x04,0x04,0x18,0x08,0xF0,0x30,0x17,0xC0,0x10,0x60,0x10,0x18,
0x14,0x0C,0x18,0x06,0x10,0x04,0x00,0x00, //歡
0x02,0x02,0x82,0x04,0x73,0xF8,0x20,0x04,0x00,0x02,0x3F,0xE2,
0x20,0x42,0x40,0x82,0x40,0x02,0x3F,0xFA,0x20,0x02,0x20,0x42,
0x20,0x22,0x3F,0xC2,0x00,0x02,0x00,0x00, //迎
0x00,0x00,0x02,0x01,0x42,0x02,0x22,0x04,0x3A,0x18,0x13,0xE0,
0x02,0x00,0xFE,0x00,0x02,0x00,0x03,0xFC,0x0A,0x02,0x72,0x02,
0x22,0x02,0x06,0x02,0x02,0x1E,0x00,0x00, //光
0x00,0x00,0x1F,0xF8,0x00,0x00,0x00,0x00,0x7F,0xFE,0x02,0x00,
0x0C,0x00,0xF1,0xFE,0x50,0x84,0x10,0x84,0x18,0xFC,0x16,0x84,
0x10,0x84,0x11,0xFE,0x10,0x80,0x00,0x00, //臨
0x00,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x10,0x40,0x10,0x40,
0x10,0x40,0xFF,0xFF,0x10,0x40,0x10,0x40,0x10,0x40,0x10,0x40,
0x3F,0xE0,0x10,0x00,0x00,0x00,0x00,0x00, //中
0x00,0x00,0x7F,0xFF,0x40,0x02,0x50,0x12,0x51,0x12,0x51,0x12,
0x51,0x12,0x5F,0xF2,0x51,0x12,0x51,0x92,0x51,0x72,0x50,0x12,
0x40,0x02,0x7F,0xFF,0x00,0x00,0x00,0x00, //國
0x00,0x00,0x00,0x00,0x1F,0xF0,0x12,0x20,0x12,0x20,0x12,0x20,
0x12,0x20,0xFF,0xFC,0x12,0x22,0x12,0x22,0x12,0x22,0x12,0x22,
0x1F,0xF2,0x00,0x02,0x00,0x0E,0x00,0x00, //電
0x00,0x80,0x00,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x82,
0x40,0x81,0x47,0xFE,0x48,0x80,0x50,0x80,0x60,0x80,0x40,0x80,
0x00,0x80,0x01,0x80,0x00,0x80,0x00,0x00, //子
0x01,0x00,0x02,0x00,0x0C,0x00,0x3F,0xFE,0xE0,0x00,0x50,0x00,
0x15,0x7E,0x15,0x44,0x95,0x44,0x75,0x44,0x55,0x44,0x15,0x44,
0x15,0x7E,0x10,0x00,0x10,0x00,0x00,0x00, //信
0x00,0x00,0x00,0x04,0x00,0x1C,0x3F,0x80,0x2A,0xBC,0x2A,0x82,
0x6A,0x82,0xAA,0xA2,0x2A,0x9A,0x2A,0x82,0x2A,0x82,0x3F,0x8E,
0x00,0x00,0x00,0x10,0x00,0x0C,0x00,0x00, //息
0x10,0x80,0x10,0x82,0x11,0x01,0xFF,0xFE,0x12,0x00,0x14,0x02,
0x00,0x02,0x13,0x04,0x12,0xC8,0x12,0x30,0xFE,0x30,0x12,0x48,
0x13,0x84,0x12,0x06,0x10,0x04,0x00,0x00, //技
0x08,0x08,0x08,0x08,0x08,0x10,0x08,0x20,0x08,0x40,0x09,0x80,
0x0A,0x00,0xFF,0xFE,0x0A,0x00,0x09,0x00,0x48,0x80,0x28,0x60,
0x08,0x30,0x08,0x18,0x08,0x10,0x00,0x00, //術
0x08,0x00,0x8F,0x01,0x68,0x01,0x11,0xFA,0x09,0x02,0x13,0x04,
0x23,0x08,0xE5,0x70,0x25,0x08,0x39,0x08,0x25,0x04,0x33,0xF6,
0x32,0x03,0x21,0x02,0x01,0x00,0x00,0x00, //資
0x08,0x20,0x84,0x3F,0x60,0xC0,0x07,0x02,0x00,0x0C,0x7F,0xF0,
0x40,0x04,0x4F,0x88,0x5A,0xB2,0x6A,0x81,0x4A,0xFE,0x4A,0x80,
0x4A,0xA0,0x4F,0x90,0x40,0x0C,0x00,0x00, //源
0x00,0x00,0x7F,0xFE,0x40,0x10,0x48,0x20,0x44,0xC0,0x43,0x00,
0x44,0xC0,0x58,0x30,0x44,0x20,0x42,0x40,0x41,0x80,0x4E,0x64,
0x44,0x06,0x7F,0xFC,0x00,0x00,0x00,0x00, //網
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //空
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //空
};
#pragma data: data
/************************************************
函 數 名: DelaymS()
功 能: 毫秒級延時函數
輸入參數: 延遲時間/系統晶體
輸出參數: 做相應的延遲處理
描 述: /
***********************************************/
void DelaymS (uint i) //延時函數,參數i為延時時間
{
uchar j; //雙重延時
for (;i!=0;i--)
{
for (j=30;j!=0;j--);
}
}
/************************************************
函 數 名: Init_port()
功 能: 單片機初始化函數
輸入參數: /
輸出參數: /
描 述: 相關口方向的設置等
***********************************************/
void Init_Port(void)
{
DDRD = 0xff; //PD口為推挽1輸出
PORTD = 0x00; //PD口初始值為0
}
/************************************************
函 數 名: InputByte()
功 能: 串行寫入32bit數據(一行)的函數
輸入參數: lie_qishi(起始的列) ,hang_no(需要送第幾行)
輸出參數: /
描 述: DATA=PD4為數據端,SRCLK=PD6為時鐘端,bit7在先,時鐘上升沿寫入。
***********************************************/
void InputByte (uint lie_qishi,uchar hang_no)
{
uchar i,mid;
for(i=32;i>0;i--)
{
mid = buf[lie_qishi +i+i] & hang_no; //操作的是hang_no位。
if(mid==0)
PORTD |= (1<<PD4); //數據端輸出0,共陽LED,所以取反碼
else
PORTD &= ~(1<<PD4); //否則輸出1
PORTD |= (1<<PD6); //時鐘置高,產生下降沿。
NOP();
PORTD &= ~(1<<PD6); //時鐘置低
}
}
/************************************************
函 數 名: switch_hang ()
功 能: 選行操作,控制138的輸入
輸入參數: /
輸出參數: /
描 述: /
***********************************************/
void switch_hang (uchar hang) //選行操作
{
uchar byTemp;
byTemp = PORTD & 0xF0;
if (hang < 8)
{
PORTD = byTemp + 0x08 + hang; //D=1
}
else
{
PORTD = byTemp + hang - 0x08; //D=0
}
}
/************************************************
函 數 名: Display()
功 能: 動態掃描LED顯示函數
輸入參數: /
輸出參數: /
描 述: 共16行,每行連續送4個字節的數據,兩個字節為第2個漢字,后兩個為第1個漢字。
***********************************************/
void Display (uint mov_no) //動態顯示函數
{
uchar i;
for(i=0;i<8;i++) //上面8行
{
PORTD |= (1<<PD7); //OE=1,關閉輸出,消隱
switch_hang (i); //選行操作
InputByte ((mov_no+mov_no),(0b10000000>>i)); //起始列和需要送顯示的行
PORTD |= (1<<PD5); //RCLK=1,并行輸出鎖存器
NOP();
PORTD &= ~(1<<PD5); //RCLK=0
//DelaymS(1); //消隱的時間,調節亮度用
PORTD &= ~(1<<PD7); //OE=0,數據輸出
DelaymS(2); //行顯示的時間
}
for(i=0;i<8;i++) //下面8行
{
PORTD |= (1<<PD7); //OE=1,關閉輸出,消隱
switch_hang (i+7); //選行操作
InputByte ((mov_no+mov_no+1),(0b10000000>>i)); //起始列和需要送顯示的行
PORTD |= (1<<PD5); //RCLK=1,并行輸出鎖存器
NOP();
PORTD &= ~(1<<PD5); //RCLK=0
//DelaymS(1); //消隱的時間,調節亮度用
PORTD &= ~(1<<PD7); //OE=0,數據輸出
DelaymS(2); //行顯示的時間
}
}
//*****************主程序**********************************
void main (void)
{
uint i;
uchar j;
DelaymS(100);
Init_Port(); //初始化
while (1)
for (i=0;i<272;i++)
{
for (j=0;j<7;j++) //移動的速度
Display (i); //動態顯示函數
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -