標題:
串口通信FAT32讀sd卡點陣屏灰度圖片顯示
[打印本頁]
作者:
模燈族
時間:
2016-4-3 17:59
標題:
串口通信FAT32讀sd卡點陣屏灰度圖片顯示
/***********************************************
16x32點陣屏16級灰度顯示
單片機:STC12C5616AD
程序原創(chuàng):徐長偉
時間:2015/08/03
//分五場掃描增加亮度,全高PWM掃三場,1/2PWM一場,1/4PWM一場
//每個char數據存兩個點的數據以節(jié)約空間
***********************************************/
#include<STC12C56.H>
#include"mydef.h"
#include"init.h"
/********延時函數2***********/
void delay(uint a)
{
uint c;
for(c=0;c<50000;c++)
for(;a>0;a--);
}
/********清0函數***********/
void delete ()
{
uchar m,n;
for(m=0;m<16;m++)
{
for(n=0;n<16;n++)
{
dispram[n+m*16]=0;
disphuan[n+m*16]=0;
}
}
}
/********串口發(fā)送函數***********/
void UART_Send (uchar dat)
{
TI=0;
SBUF=dat;
while(!TI);
TI=0;
}
/********灰度修正函數***********/
void huidu_chuli ()
{
uint i;
uchar x,y;
for(i=0;i<256;i++)
{
x=dispram[i]&0xf0;
y=dispram[i]&0x0f;
x>>=4;
//if(x>0&&x<15)
x-=4;
//if(y>0&&y<15)
y-=4;
if(x>15)x=0;
if(y>15)y=0;
dispram[i]=0;
dispram[i]=x<<4;
dispram[i]|=y;
}
for(i=0;i<256;i++)
{
x=disphuan[i]&0xf0;
y=disphuan[i]&0x0f;
x>>=4;
//if(x>0&&x<15)
x-=4;
//if(y>0&&y<15)
y-=4;
if(x>15)x=0;
if(y>15)y=0;
disphuan[i]=0;
disphuan[i]=x<<4;
disphuan[i]|=y;
}
}
/********74HC595移位寄存器送數子函數***********/
/*
void song(uchar z,uchar y)//帶參數函數
{
uchar num;//定義變量
for(num=0;num<8;num++)//移動8次將數據發(fā)送完畢
{
CLK=0;//上升沿送走數據
if(z&0x01==1)//將高7位屏蔽掉,保留最低位判斷 ////////上半屏(右半屏)
DATA=1;//為1就將74HC595數據端置1
else
DATA=0;//否則給0
if(y&0x01==1)//將高7位屏蔽掉,保留最低位判斷 ////////下半屏(左半屏)
DATA_TOP=1;//為1就將74HC595數據端置1
else
DATA_TOP=0;//否則給0
CLK=1;//高電平形成上升沿
z>>=1;//將數移走一位
y>>=1;
}
}
*/
/********灰度分場處理函數***********/
void huidu ()
{
static uchar k,l,s,ss,v,num;
uchar temp,temp1,temp2;
v=hang;//下一行
for(k=0;k<32;k++)
{
Gray[k]=0;//清除內存
}
for(num=0;num<4;num++)//每次存一行的點的全部4BIT(權*N,N=0~3)灰度值
{
for(k=0;k<4;k++)//Gray數組里每個字節(jié)存4個點的權*N位灰度值,32行點陣分為16行*2,所以要4*2=8個字節(jié)
{
s=8;
for(l=0;l<4;l++)//Gray里每個字節(jié)存兩個點的灰度值(16級灰度來說)每次存兩個點的各一位灰度(即兩位)循環(huán)4次就是8位
{
ss=s-1;
temp2=l+(k<<2)+(v<<4);
temp=dispram[temp2];//把內存里數據依次調出
temp1=disphuan[temp2];//把內存里數據依次調出
Gray[k+(num<<3)]|=((temp>>p)&0x01)<<ss;//右移4位后數據高4位的后半字節(jié)依次將BIT4-BIT7右移
Gray[k+4+(num<<3)]|=((temp1>>p)&0x01)<<ss;
p-=4;//右移指針等于0處理前半字節(jié)
s--;//左移指針減一以便依次將每一組BIT位從高位至低位順序存入Gray[k]
ss=s-1;
Gray[k+(num<<3)]|=((temp>>p)&0x01)<<ss;//右移0位后數據低4位的數據前半字節(jié)依次將BIT0-BIT3右移
Gray[k+4+(num<<3)]|=((temp1>>p)&0x01)<<ss;
p+=4;//右移指針等于4處理后半字節(jié)
s--;//左移指針再減一
}
}
p++;//將數據灰度值右移一位(第0BIT直到第3BIT)
}
p=4;//右移4位后復位到4
}
/***************串口初始化函數*****************/
void UART_OK ()
{
CCAPM1=0X00;
P3M0=0x00;
P3M1=0x00;
SCON=0X40;//串口方式1/REN=0
PCON=0X80;// 波特率倍增
TMOD = 0x20; // TMOD: timer 1, mode 2, 8-bit 重裝
TH1= 0xFD; // TH1: 重裝值 57600 波特率 晶振 33.1776MHz
TL1= 0xFD;
TR1= 1; // TR1: timer 1 打開
PPCA_LVD=0;
EPCA_LVD=0;
ES=0;
REN=1;
PS=1;
IPH|=~PPCA_LVDH;
EA=1;
TR0 = 0;
}
/***************主函數*****************/
void main()
{
uchar n;
//Init();
delay(3000);
UART_OK();
CCAP1L=PWM_1_8;
CCAP1H=PWM_1_4;
qie=0;
while(1)
{
if(!flag_es_ok)
{
while(aa!=_READY_) //從機等待主機發(fā)送的握手信號
{
UART_Send (_STAR_);
if(RI)
{
aa=SBUF;
RI=0;
}
}
UART_Send (_OK_);
ES=1;
}
check=255;//數據校驗初值
while(!flag_es_ok);
if(!flag_es_init) huidu_chuli ();//灰度修正
if(!flag_es_init){flag_es_init=1;Init();}
if(qie==TIME_1)
{
LED=1;
aa=_BUSY_;
flag_es_init=0;
flag_es_ok=0;
ISP_CONTR|=SWRST;//軟復位
}
if(flag_zhen)//如果一幀掃描完就右移一次
{
flag_zhen=0;
if(++hang==16)//顯示16行
{
hang=0;
qie++;
}
}
if(flag_qie){flag_qie=0;huidu ();}//灰度分解
if(flag_chang)////每場進入一次/如果一場掃描完再切到下一行避免虛影
{
if(flag_es_ok)
{
for(n=8;n>0;n--)//lienum=595片數//595片數=6以上顯示才穩(wěn)定song(~Gray[n-1],~Gray[n+3]);
{
if(n>4)
{
_datu=~Gray[n-5+(t<<3)];
_datd=~Gray[n-1+(t<<3)];
DATA=_datu0;
DATA_T
IMG_20150930_200125.jpg
(2016-4-3 17:59 上傳)
原圖尺寸 367.53 KB, 下載次數: 62
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1