久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5001|回復: 1
收起左側

CPLD作為并行接口

[復制鏈接]
ID:51472 發表于 2013-7-9 04:00 | 顯示全部樓層 |閱讀模式
     利用51hei-7 cpld開發板http://www.zg4o1577.cn/bbs/dpj-19813-1.html 上的CPLD和單片機,可以做很多實驗,以下舉一個例子。
1、功能描述
  單片機的P0、P1和P2與CPLD各引腳相連,本例是將CPLD作為一個并行接口,讀出各引腳的數據并在CPLD的顯示器上顯示出來。使用單片機智能模塊中的Up和Down鍵,分別按下這兩個鍵可使預定的數據增加或減少,該數據顯示在智能模塊的LED顯示器上,同時送往P0和P1口。
  CPLD讀出與P0和P1口相連的引腳的狀態,以十六進制的格式顯示在CPLD模塊的四位顯示器上。
2、單片機程序
/***************************************************************
;* 單片機教程網
;*    (c) Copyright 2004,Mcustudio,JiangSu,LiYang
;*     All  Rights Reserved
;*    key.c
;*    編程:周
;*    用于CPLD實驗板
;*    定時中斷實現顯示的程序
;*    按Up鍵加1,按Down鍵減1
;*    數據同時輸出到P0和P1口
***************************************************************/
#include <intrins.h>
#include "reg52.h"
#define uchar unsigned char
#define uint  unsigned int

uchar   Xnjz; //虛擬鍵值
uint Data=100;

sbit  KeyShift=P3^5; //移位鍵
sbit KeyUp=P3^6; //Up鍵
sbit KeyDown=P3^7; //Down鍵

uchar code BitTab[]={0x01,0x02,0x04,0x08,0x10,0x20};
uchar code DispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};

uchar Count=0; //計數器,顯示程序通過它得知現正顯示哪個數碼管
uchar DispBuf[6]={1,2,3,4,5,6}; //6字節的顯示緩沖區
#define Hidden 0x10; //消隱碼

////定義引腳
sbit    Dat=P3^2; //
sbit    Clk=P3^3;
sbit    RCK=P3^4; //


/* 發送往顯示  */
void SendData(unsigned char SendDat)
{ unsigned char i;
for(i=0;i<8;i++)
{ if((SendDat&0x80)==0)
Dat=0;
else
Dat=1;
_nop_();
Clk=0;
_nop_();
         Clk=1;
SendDat=SendDat<<1;
}
}

void Timer0() interrupt 1
{ uchar tBit=0,tSeg=0;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256; //定時時間為2500個周期,采用stc89c52rc單片機,倍速
tBit=BitTab[Count]; //取位值
tSeg=DispBuf[Count]; //取出待顯示的數
tSeg=DispTab[tSeg]; //取字形碼
RCK=0;
SendData(tSeg); //段驅動
SendData(tBit); //位驅動
RCK=1;
Count++;
if(Count==6)
Count=0;
}

void mDelay(unsigned int Delay)
{ unsigned int i;
for(;Delay>0;Delay--)
{ for(i=0;i<124;i++)
{;}
}
}


void KeyProcess(uchar KeyVal)
{
switch(KeyVal)
{ case 0xfb: //移位鍵
break; //在本程序中沒有什么用處
case 0xfd: //Up鍵
{ if(Data<9999)
Data++;
break;
        }
        case 0xfe:        //Down鍵
        { if(Data>0)
Data--;
           break;
        }
}
}

//預處理鍵值,將鍵位移入虛擬鍵值中
void PreKey()
{ uchar Ktmp=0;

KeyShift=1; //移位鍵
KeyUp=1; //Up鍵
KeyDown=1; //Down鍵

Ktmp=Ktmp<<1;
if(KeyShift)
Ktmp|=0x01;
Ktmp=Ktmp<<1;
if(KeyUp)
Ktmp|=0x01;
Ktmp=Ktmp<<1;
if(KeyDown)
Ktmp|=0x01;
Xnjz=Ktmp; //虛擬鍵值
}

void Key() /*鍵處理*/
{ uchar tmp1,tmp2;
PreKey();
tmp1=Xnjz|0xf8;
if(tmp1==0xff) //無鍵按下
return;
else
{ mDelay(10); //延時10ms
PreKey();
tmp1=Xnjz|0xf8;
if(tmp1==0xff)
return;
else
{ tmp2=tmp1;
for(;;)
{ PreKey();
tmp1=Xnjz|0xf8;
if(tmp1==0xff)
break;
}
KeyProcess(tmp2);
}
}
}

void main()
{ uint tmp;
TMOD=0x11;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256; //定時時間為2500個周期
TR0=1;
EA=1;
ET0=1;

for(;;)
{ Key();
tmp=Data;
DispBuf[5]=tmp%10;
tmp/=10;
DispBuf[4]=tmp%10;
tmp/=10;
DispBuf[3]=tmp%10;
tmp/=10;
DispBuf[2]=tmp%10;
DispBuf[1]=Hidden;
DispBuf[0]=Hidden;
P1=Data%256;
P0=Data/256;
}
}

3、CPLD所用的verilog程序
//說明:用于csbx-1A實驗板
//功能:讀出與單片機P0和P1口相連的16位引腳的狀態,并將其值以十六進制的形式顯示在數碼管上
//與之配套的單片機程序為Key.c
//狀態:單片機程序及CPLD程序均已通過調試
module parallel(iDat1,iDat2,clock,seg,sl);
    input [7:0] iDat1; //read P0 port data
    input [7:0] iDat2; //read P1 port data
    input clock;
    output [7:0] seg;
    output [3:0] sl;

reg [7:0] seg_reg;
reg [3:0] sl_reg;
reg [3:0] disp_dat;
reg [36:0] count;


always@(posedge clock)
begin
  count=count+1; //計數器
end

always@(count[14:13]) //定義顯示數據觸發事件
begin
  case(count[14:13]) //選擇掃描顯示數據
2'h0:disp_dat=iDat1[7:4]; //顯示個位數據
2'h1:disp_dat=iDat1[3:0];
2'h2:disp_dat=iDat2[7:4];
2'h3:disp_dat=iDat2[3:0]; //顯示百位數據
   endcase
   case(count[14:13]) //選擇數碼管顯示位
2'h0:sl_reg=4'b1110; //選擇個位數碼管
2'h1:sl_reg=4'b1101;
2'h2:sl_reg=4'b1011;
2'h3:sl_reg=4'b0111;
endcase
end

always@(disp_dat)
begin
  case(disp_dat)
4'h0: seg_reg = 8'hc0; //顯示0
4'h1: seg_reg = 8'hf9; //顯示1
4'h2: seg_reg = 8'ha4; //顯示2
4'h3: seg_reg = 8'hb0; //顯示3
4'h4: seg_reg = 8'h99; //顯示4
4'h5: seg_reg = 8'h92; //顯示5
4'h6: seg_reg = 8'h82; //顯示6
4'h7: seg_reg = 8'hf8; //顯示7
4'h8: seg_reg = 8'h80; //顯示8
4'h9: seg_reg = 8'h90; //顯示9
4'ha: seg_reg = 8'h88; //顯示a
4'hb: seg_reg = 8'h83; //顯示b
4'hc: seg_reg = 8'hc6; //顯示c
4'hd: seg_reg = 8'ha1; //顯示d
4'he: seg_reg = 8'h86; //顯示e
4'hf: seg_reg = 8'h8e; //顯示f
endcase
end

assign seg=seg_reg;
assign sl=sl_reg;


endmodule
4、實現方法
   ......
回復

使用道具 舉報

ID:80847 發表于 2022-1-27 15:21 | 顯示全部樓層
學習 CPLD
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91美女视频 | 国产精品一区二区三区四区 | 亚洲国产一区二区在线 | 日韩欧美网 | 久久亚洲一区二区 | 天天干天天操 | www.久久| 久久精品综合 | 国产精品亚洲第一区在线暖暖韩国 | 91精品国产乱码久久久久久 | 精品久久久久久久久久久久 | 欧洲精品在线观看 | 日韩久久中文字幕 | 国产美女黄色 | 成人在线免费视频 | 国产91精品久久久久久久网曝门 | 国产精品久久久久久 | 午夜视频免费在线观看 | 一级二级三级黄色 | 中文字幕一区二区三区四区五区 | 午夜精品久久久久久久星辰影院 | 国产高清视频一区 | 成人国产精品久久久 | 古装三级在线播放 | 久久亚洲一区二区三区四区 | 99精品一区二区 | 五月综合激情网 | 国产精品有限公司 | 91久久夜色精品国产网站 | 久久爱黑人激情av摘花 | 久久久久久黄 | 成人毛片在线视频 | 综合色婷婷 | tube国产| 国产成人免费 | 国产一区二区在线视频 | 看羞羞视频免费 | 蜜桃官网| 国产精品国产三级国产aⅴ中文 | 国产精品欧美一区二区 | 91精品国产色综合久久 |