16x32點陣使用74hc595驅動問題;
行是陽極,列是陰極!!!
行是兩個595驅動、列是4個595驅動,顯示斜杠或亂碼?,研究了好幾天,實在是不知所錯,很是無奈!!!跪求大師給予幫助不勝感激!!!
程序如下;
#include <STC12C5630AD.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/****************行74HC595****************/
//sbit H141 = P1^4;
//sbit H121 = P1^3;
//sbit H111 = P1^2;
sbit HSER = P1^4; //數據輸入
sbit HSCK = P1^3; //串行移位時鐘
sbit HRCK = P1^2; //鎖存器時鐘
sbit kk = P2^5;
/****************列74HC595****************/
//sbit U514 = P1^7;
//sbit U512 = P1^6;
//sbit U511 = P1^5;
sbit LSER = P1^7; //數據輸入
sbit LSCK = P1^6; //串行移位時鐘
sbit LRCK = P1^5; //鎖存器時鐘
uchar code htab[]={
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80
};
uchar code ltab[]={
/*-- 文字: 我 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x20,0x24,0x24,0x24,0xFE,0x23,0x22,0x20,0x20,0xFF,0x20,0x22,0x2C,0xA0,0x20,0x00,
0x00,0x08,0x48,0x84,0x7F,0x02,0x41,0x40,0x20,0x13,0x0C,0x14,0x22,0x41,0xF8,0x00,
/*-- 文字: 愛 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x80,0x64,0x2C,0x34,0x24,0x24,0xEC,0x32,0x22,0x22,0x32,0x2E,0x23,0xA2,0x60,0x00,
0x00,0x41,0x21,0x91,0x89,0x87,0x4D,0x55,0x25,0x25,0x55,0x4D,0x81,0x80,0x80,0x00,
/*-- 文字: 你 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x80,0x60,0xF8,0x07,0x40,0x20,0x18,0x0F,0x08,0xC8,0x08,0x08,0x28,0x18,0x00,
0x01,0x00,0x00,0xFF,0x00,0x10,0x0C,0x03,0x40,0x80,0x7F,0x00,0x01,0x06,0x18,0x00,
};
/*****************************************/
/****************延時函數*****************/
void delay1ms(uint z) //@11.0592MHz
{
uint x,y;
for(x=z;z>0;x--)
for(y=848;y>0;y--);
}
void Delay10us() //@11.0592MHz
{
unsigned char i;
_nop_();
_nop_();
_nop_();
i = 24;
while (--i);
}
/****************主函數*******************/
/****************行函數*******************/
void H74HC595(uchar Data,uchar hData) //74HC595的數據串入并出子程序
{
uchar i=0,f=0;
for(i=0;i<8;i++) //由高位到低位發送一個字節
{
LSER = Data>>7;
Data=Data<<1; //左移一位,最高位溢出到位寄存器CY
//從位寄存器的進位標志位CY讀取
HSCK = 0; //串行移位
HSCK = 1;
HSCK = 0;
}
for(f=0;f<8;f++) //由高位到低位發送一個字節
{
hData<<=1; //左移一位,最高位溢出到位寄存器CY
HSER=CY; //從位寄存器的進位標志位CY讀取
HSCK = 0; //串行移位
HSCK = 1;
HSCK = 0;
}
HRCK = 0; //鎖存
HRCK = 1;
HRCK = 0;
}
/*****************************************/
/****************列函數*******************/
void L74HC595(uchar bData,uchar aData,uchar cData,uchar dData)
{
uchar i=0,k=0,j=0,h=0;
for(i=0;i<8;i++)
{
LSER = bData>>7; //送出7位數據
bData= bData<<1;
LSCK = 0; //上升沿,讓串行輸入時鐘變為高電平,并延時2個時鐘周期
LSCK = 1;
LSCK = 0; //變為低電平,為下次準備
}
for(k=0;k<8;k++)
{
LSER = aData>>7; //送出7位數據
aData= aData<<1;
LSCK = 0; //上升沿,讓串行輸入時鐘變為高電平,并延時2個時鐘周期
LSCK = 1;
LSCK = 0; //變為低電平,為下次準備
}
for(j=0;j<8;j++)
{
LSER = cData>>7; //送出7位數據
cData= cData<<1;
LSCK = 0; //上升沿,讓串行輸入時鐘變為高電平,并延時2個時鐘周期
LSCK = 1;
LSCK = 0; //變為低電平,為下次準備
}
for(h=0;h<8;h++)
{
LSER = dData>>7; //送出7位數據
dData= dData<<1;
LSCK = 0; //上升沿,讓串行輸入時鐘變為高電平,并延時2個時鐘周期
LSCK = 1;
LSCK = 0; //變為低電平,為下次準備
}
//位移寄存器數據準備完畢,轉移到存儲寄存器
LRCK = 0; //上升沿,讓存儲寄存器時鐘變為高電平,并延時2個時鐘周期
LRCK = 1;
LRCK = 0;
}
/*****************************************/
void main()
{
uchar t;
kk=0;
HSER=0;LSER=0;
while(1)
{
for(t=0;t<16;t++)
{
H74HC595(htab[t],htab[t]);
L74HC595(ltab[t],ltab[t],ltab[t],ltab[t]);
}
}
}
|